下面以“大牛直播SDK 的 RTSP 播放器遇到 RTP 不带 Marker 位(M bit)”为切入点,结合 RTP/RTCP 基础 与 H.264/H.265/AAC 的负载规范,说明发送端如何规范打包 一、先厘清 Marker 位在各规范里的语义 RTP 基础(RFC 3550):M 位的语义由具体负载格式定义,常用于标记“重要边界事件”(如视频帧边界或音频语音突发边界)。 序号:RTP 序号每包 +1,随机起始。 Marker:仅在“该 AU 的最后一包”置 1;否则为 0。 四、接收端(播放器)如何“稳健容错”:Marker 缺失时的切帧策略即使对端未设置 M 位,播放器也应能“稳健切帧”而不积压卡顿: 按 (SSRC, RTP 时间戳) 聚帧 同一 AU 的所有包时间戳相同 结合负载内信号 FU 分片的 E 标志 只标识“NALU 结束”,并不等同于“AU 结束”; 若存在 AUD NALU(H.264 type 9 / HEVC type 通常 35),可将其作为 AU
RTSP被用于建立的控制媒体流的传输,它为多媒体服务扮演“网络远程控制”的角色。尽管有时可以把RTSP控制信息和媒体数据流交织在一起传送,但一般情况RTSP本身并不用于转送媒体流数据。 媒体数据的传送可通过RTP/RTCP等协议来完成。 一次基本的RTSP操作过程是:首先,客户端连接到流服务器并发送一个RTSP描述命令(DESCRIBE)。 客户端再分析该SDP描述,并为会话中的每一个流发送一个RTSP建立命令(SETUP),RTSP建立命令告诉服务器客户端用于接收媒体数据的端口。 流媒体连接建立完成后,客户端发送一个播放命令(PLAY),服务器就开始在UDP上传送媒体流(RTP包)到客户端。 在播放过程中客户端还可以向服务器发送命令来控制快进、快退和暂停等。 第五步: 数据传送播放中 S->C:发送流媒体数据 // 通过RTP协议传送数据 6.
关键点: 该功能实现,主要需要考虑RTSP取摄像头视频流,拆RTP包,组H264帧,通过PJSIP的视频通道转发;这个过程中,涉及到RTP通道保活,RTSP通道保活;调试时间多耗费在对摄像头返回的RTP == 0){ printf_data(data, 7); printf("[1]seq:%d, old_type:%d, nalu_type:%d marker:%d, len:%d,last_len :%d\r\n", seq,old_type, nalu_type, marker, len, last_rtp_frame_cache_len); } if (nalu_type == 28) { :%d, data:%02x, nalu_type:%d marker:%d, len:%d,last_len:%d\r\n", seq,data[0], nalu_type, marker, len, ), payload, len); last_rtp_frame_cache_len += len; } } if (marker){ //reset 0 if (getFrameCallback
前面我们花了较多的篇幅来介绍了RTSP协议的一些细节,但是rtsp传输,本质上涉及三种协议,RTSP、RTP以及RTCP。RTSP主要负责连接建立,销毁及一些其他的控制。 而实际涉及媒体数据传输使用的是RTP协议,本节我们来介绍一下RTP协议。 RTP概览 RTP是一种应用层协议,传输层协议可以是TCP或者UDP(UDP多一些)! RTP数据包由两部分组成,一部分是RTP Heaeder,一部分是RTP body,RTP Header占用最少12个字节,最多72个字节;另一部分是RTP Payload,用来封装实际的数据负载,如封装 下面我们来仔细看下RTP Header和RTP Body的组织形式! RTP包格式示意图 ? M(marker) ? 值为0,表示该数据包非一帧数据的最后一帧!wireshark的解析: ? ps:当该值为1时,表示该数据包是一帧数据的最后一个数据包!
特点:RTSP协议本身不传输媒体数据,而是通过控制连接建立命令和控制,媒体数据通过其他协议(如RTP)传输。它提供了丰富的控制选项,方便用户操作,且可以穿越NAT和防火墙。应用场景:1. RTP(Real-time Transport Protocol)简介:RTP是一个实时传输媒体数据的协议,通常与RTSP一起使用。它负责在网络上传输音视频数据。 直播服务 应用场景:在直播场景中,RTP协议为高质量的音视频传输提供了保障,RTP能确保观众能够实时观看到流畅、清晰的视频内容。 总结RTMP、RTSP、RTP、HLS、DASH这些协议在流媒体传输领域各有特点,但也有一些共同点。分别在实时视频传输中各有优势,选择哪种协议取决于具体的应用场景、网络条件以及设备兼容性等因素。 RTMP、RTSP、RTP、HLS、DASH这些协议在服务于流媒体传输方面有着共同的目标和追求,同时也在各自擅长的领域发挥着重要作用。
RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它一开始被设计为一个多播协议,但后来被用在很多单播应用中。RTP协议常用于流媒体系统(配合RTCP协议或者RTSP协议)。 P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。 3. X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头。 4. 其控制流由RTSP协议来提供。 RTP协议的使用: RTP的使用实例之一如上图: 上面是某省IPTV2.0早期的一个数据包的情况。从包中可以看出RTP是怎么和RTSP配合一起使用的。 从包402到411为RTSP的协商过程,RTSP在PLAYer命令后数据包就到来。紧跟其后412包就是一个mpeg 的PES包,它是有由rtp来承载的TS来形成。 下图为420包的展开图: 从中可以看出承载RTP的为UDP的数据流这个包中有x标志位为1则说明其有 header extensions.其header extensions为最下面。
RTCP协议介绍见:音视频协议-RTCP协议介绍 2 协议格式介绍 rtp协议定义在rfc3550第5.1章RTP头定义: 版本号(2bit):默认为2; 填充标志(1bit):当设置为1时 ,最后一个字节表示填充字节数包括该字节本身,这些填充不属于荷载,解析时需要被忽略; 扩展标志(1bit):当设置为1时,rtp头后面会接一个扩展头需要解析,需要注意的是length长度是32bit为单位计算的 ,也就是4字节加1; CSRC计数(4bit):CSRC 个数最多就是15个; 标志位M(1bit):视频编码表示一帧的结束标志; 荷载类型(7bit):具体见RFC3551,0-95已经被定义 _t extension:1;//扩展 uint8_t csrccount:4;//csrc count uint8_t marker:1; //标志 uint8_t payloadtype identifier marker = (rtpheader->marker == 0)?
此版本号固定为2 rtp_hdr->marker = 0; //标志位,由详细协议规定其值。 rtp_hdr->marker=1; rtp_hdr->seq_no = htons(seq_num ++); //序列号,每发送一个RTP包增1 //设置NALU HEADER,并将这个HEADER // 设置rtp M 位;当前传输的是最后一个分片时该位置1 rtp_hdr->marker=1; //设置FU INDICATOR,并将这个HEADER填入sendbuf[12 (1400) //设置rtp M 位; rtp_hdr->marker=0; //设置FU INDICATOR,并将这个HEADER填入sendbuf[12] 2; //版本号号,此版本号固定为2 rtp_hdr->marker = 1; //标志位,由详细协议规定其值。
协议介绍 SDP 完全是一种会话描述格式(对应的RFC2327) ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP)、会话初始协议(SIP)、实时流协议(RTSP 媒体协商这一块要用RTSP来实现. 流媒体协议sdp信息,附带在describe报文中有rtsp服务端发出,主要目的,告之会话的存在和给出参与该会话所必须的信息,sdp会话完全是文本形式,采用UTF-8编码的ISO 10646字符集 sdp 会话描叙格式介绍 名称 格式: 说明 协议版本: v=0 给出sdp的版本号,目前为0版本,无子版本号 会话源 o=(用户名)(会话标识)(版本)(网络类型)(地址类型)(地址) 如果不存在用户登录名,该字段标志位 /udp上传送(RTP/AVP)IETF RTP协议,在udp上传输 格式列表: 对应对应的音频负载类型(PT) m=video 0 RTP/AVP 96 a描叙行: 格式:a=rtpmap:(净荷类型
3、RTSP和RTP(TRCP)的联系 RTP:Realtime Transport Protocol实时传输协议。RTP提供时间标志,序列号以及其他能够保证在实时数据传输时处理时间的方法。 RCTP是RTP的控制部分,用来保证服务质量和成员管理。RTP和RTCP是一起使用的。 RTSP:Realtime Streaming Protocol 实时流传输协议。 RTSP具体数据传输交割RTP,提供对流的控制。 RTP是基于UDP协议的,UDP不用建立连接,效率更高。但允许丢包,这就要求在重新组装媒体的时候多做一些工作。 应用程序对应的是play,seek,pause,stop等命令,RTSP则是处理这些命令,在UDP传输时使用RTP(RTCP)来完成。如果是TCP连接则不会使用RTP(RTCP)。 /90000 m=audio 0 RTP/AVP 97 a=control:trackID=1 a=rtpmap:97 G726-16/8000 5、RTSP交互流程 C表示rtsp客户端, S表示rtsp
RTP是一种应用层协议,一般使用 UDP作为底层协议实现数据传输,但并不强制底层协议的选择,比如利用 RTSP进行流媒体传输时使用 TCP也非常常见。 P:padding,1 bit, 填充标志。如果 P=1,则在该报文的尾部填充一个或多个额外的填充数据,它们不算作负载的一部分。填充的最后一个字节指明可以忽略多少个填充比特。 填充可能用于某些具有固定长度的加密算法,或者用于在底层数据单元中传输多个RTP包。 X:extension,1 bit,扩展标志。如果 X=1,则在 RTP 报头后将有且仅有一个扩展报头。 在接收端,主编码与所有次编码作为独立的 RTP 包提取出来,复制冗余编码包的 RTP 头中的 sequence number,SSRC,marker bit,CC field,RTP version,和 使用冗余编码的荷载格式,有可能不能正确恢复出 marker bit。在使用 RFC 2198 来进行 FEC 封装的应用程序中,必须把恢复出的媒体数据包的 marker bit 设置为零。
但是我们如果在TCP传输协议上承载RTSP/RTP将解决这些问题。 1. RTSP/RTP的控制命令和数据都通过一个端口,即RTSP的端口(默认为554),进行交互。 2. 但是,使用TCP传输协议承载RTSP/RTP需要花更多的功夫。 1. 由于二元交织,会使得RTP包封包和解包的过程变得更加复杂。 2. 接下来让我们来了解一下怎么使用TCP承载RTSP/RTP。 TCP承载RTSP/RTP 当使用TCP协议承载RTSP/RTP时,所有的命令和媒体数据都将通过RTSP端口,通常是554,进行发送。 接下来我们将描述使用TCP承载RTSP/RTP的主要要素: SETUP 要使用TCP连接,RTSP客户端需要在SETUP阶段请求TCP连接。 下面是一个rtsp客户端请求 通过rtp over tcp方式建立连接报文; SETUP之后,RTP数据将通过用来发送RTSP命令的TCP Socket进行发送。
:编码前数据(目前支持的有YV12/NV21/NV12/I420/RGB24/RGBA32/RGB565等数据类型);编码后数据(如无人机等264/HEVC数据,或者本地解析的MP4音视频数据);拉取RTSP (long var1, String var3, double var4)回放 RTSP 缩放命令回调,返回相关参数ntsOnPlaybackMANSRTSPSeekCommand(long var1, String var3, double var4)回放 RTSP 定位命令回调,返回相关参数ntsOnPlaybackMANSRTSPTeardownCommand(long var1, String var3)回放 RTSP 拆卸命令回调,返回相关参数ntsOnByePlayback(long var1, String var3)Bye 请求回调,返回相关参数ntsOnTerminatePlayback rtp_sender_handle, int is_enable)启用或禁用 RTP 发送器接收功能,参数为发送器句柄和是否启用标志public native int SetRTPSenderReceiveSSRC
从协议演化看,RTSP(控制)、RTP(承载)、RTCP(反馈)组成了“控制—数据—反馈”的最小闭环:SDP 对编解码与时间基进行约束;SETUP/PLAY 决定传输形态(RTP/UDP、RTP/TCP 如果说 RTP 负责“送数据”,RTSP 则负责“告诉系统什么时候、以何种方式去送”。 1.3 RTSP 与 RTP / RTCP 的协同关系RTSP 本身并不携带音视频内容。它的职责是会话建立 + 参数协商 + 状态管理,而数据面完全交给 RTP 与 RTCP。 五、落地示例:SmartMediaKit 的 RTSP 播放模块在前文我们系统地分析了 RTSP/RTP/RTCP 三层协议的机制与关键工程挑战。 5.2 协议层面的支持情况在协议层面,SmartMediaKit 对 RTSP/RTP/RTCP 各环节均有全面支持: RTSP 控制层 支持 TCP 与 UDP 传输模式切换、RTSP 401 鉴权机制
数据,偶数端口用来接收RTP数据,相邻的奇数端口用于接收RTCP数据! SETUP表明消息类型; URI表示请求的RTSP服务器的地址; RTSP_VER表明RTSP的版本; TRANSPORT表明媒体流的传输方式,具体包括传输协议如RTP/UDP;指出是单播,组播还是广播 该SETUP请求中,Transport字段声明了两个端口,26968和26969,同时指明了通过UDP发送RTP数据,26968端口用来接收RTP数据,26969端口用来接收RTCP数据,unicast 请求之后,如果没有异常情况,RTSP服务器的回复比较简单,回复200 OK消息,同时在Transport字段中增加sever_port,指明对等的服务端RTP和RTCP传输的端口,增加ssrc字段,增加 通过该抓包文件,我们可以看出,服务端对应SETUP请求的RTP和RTCP的传输端口分别为8284和8285;ssrc的值为4a7fb757;mode="play"表示当前rtsp连接是播放模式!
二、TCP模式:数据与控制复用在 TCP 模式下(即 RTP over RTSP/TCP 或者 interleaved 模式): 视频/音频数据直接通过已有的 RTSP TCP 连接传输; 不需要额外开辟 总结一路 RTSP 流(TCP模式)= 1 个端口。 三、UDP模式:RTP/RTCP独立传输在 UDP 模式下(即 RTP over UDP): 视频和音频各自使用 RTP 通道来传输数据; 每一路媒体流(RTP)都需要一个对应的 RTCP 通道来传输控制信息 例如,NVR/DVR 系统在大规模接入摄像头时,应合理分配 RTP 端口池。 六、结论一路 RTSP 流的端口占用,取决于传输模式: TCP 模式:仅需 1 个端口(RTSP TCP 通道)。 UDP 模式:通常需要 3~5 个端口(RTSP 控制 + RTP/RTCP 对)。 理解这一点,不仅能帮助开发者合理配置端口和防火墙策略,也能在系统架构设计中更好地平衡 实时性 与 可部署性。
: 473 v=0 o=- 0 0 IN IP4 127.0.0.1 s=No Name c=IN IP4 127.0.0.1 t=0 0 a=tool:lal 0.22.0 m=video 0 RTP 并且对应的类型为97: m=audio 0 RTP/AVP 97 b=AS:128 a=rtpmap:97 MPEG4-GENERIC/48000/2 a=fmtp:97 profile-level-id Streaming Media v2016.11.28) Transport: RTP/AVP;unicast;client_port=54374-54375 RTSP/1.0 200 OK CSeq : 4 Date: Thu, 15 Jul 2021 10:34:36 CST Session: 191201771 Transport:RTP/AVP/UDP;unicast;client_port= ) Transport: RTP/AVP;unicast;client_port=54376-54377 Session: 191201771 RTSP/1.0 200 OK CSeq: 5 Date
二、RTSP / RTP 协议机制深度解读要理解轻量级 RTSP 服务 SDK 的价值,必须先回顾 RTSP 与 RTP 的核心机制。 简而言之:RTSP 管“会话”,RTP 管“数据”,SDP 管“说明”。 内置协议栈:RTSP/RTP/SDP 由 SDK 自研实现,不依赖第三方服务。 多会话能力:单设备支持多客户端同时拉流。 从 技术层面 来看,它是对 RTSP/RTP/SDP 标准协议的工程化、轻量化实现,使得任意 Android 设备都能以最小的依赖成本,直接对外提供合规的实时流。 展望未来,随着 H.265/AV1 编码、QUIC/RTP 新一代低延迟传输标准 的普及,轻量级 RTSP 服务 SDK 将在更多场景中被深度嵌入: 在 低空经济 中,支撑无人机群组的多路视频回传;
RTSP并不包括具体数据的传输,该功能一般由RTP与RTCP协议来实现,并可以通过TCP或UDP两种底层传输方式进行。 之前说过,流媒体数据传输不是RTSP协议的内容,由RTP包来做。但是具体在实现上,RTP包可以通过UDP或TCP的方式来进行,而且这两种传输方式,区别其实还不小,下面具体说下。 RTSP over UDP 对于udp模式,客户端在发送PLAY以后,就开始建立udp端口,以接收服务器发来的RTP包,同样,服务器也会建立udp端口,并向客户端发送RTP包。 由于跟rtsp消息使用同一个tcp端口,为了区分,rtp以及rtcp包,增加了4个字节额外的字段,并通过特殊的标识'$',与正常的rtsp消息进行了区分。 ? 主要代码 3.1 Rtsp服务接口 ? 3.2 RtspSession在TCP通道里处理RTSP消息与RTP报文 ? 4.
01 GB28181中的RTP over TCP GB28181的TCP码流遵循的标准是RFC4571(RTP OVER TCP),具体类型是: 0 1 )-and-RTP-Control-Protocol-(RTCP)-Packets-over-Conn.pdf》文档 02 RTSP中的RTP over TCP RTSP中tcp码流是遵循的RFC2326 data :数据 - ,比如说RTP包,总长度与上面的数据长度相同 RTP,RTCP数据和RTSP数据共享TCP数据通道,所以必须有一个标识来区别三种数据: RTP和RTCP数据会以$符号+1个字节的通道编号 +2个字节的数据长度,共4个字节的前缀开始, RTSP数据是没有前缀数据的。 RTP数据和RTCP数据的区别在于第二个字节的通道编号 03 两个标准的区别 RFC4571标准格式: 长度(2字节) + RTP头+数据 RFC2326标准格式:$(1字节)+通道号(1字节)+长度